﻿////.*
//#include<iostream>
//using namespace std;
//
//// 编译报错："operator +"必须至少有⼀个类类型的形参
//int operator+(int x, int y)
//{
//    return x - y;
//}
//
//class A
//{
//public:
//    void func()
//    {
//        cout << "A::func()" << endl;
//    }
//};
//
//typedef void(A::* PF)(); //成员函数指针类型
//
//int main()
//{
//    // C++规定成员函数要加&才能取到函数指针
//    PF pf = &A::func;
//    A obj;//定义obj类对象
//
//    // 对象调⽤成员函数指针时，使⽤.*运算符
//    (obj.*pf)();
//
//    return 0;
//}

//运算符重载
//#include<iostream>
//using namespace std;
//
//class Date
//{
//public:
//    Date(int year = 1, int month = 1, int day = 1)
//    {
//        _year = year;
//        _month = month;
//        _day = day;
//    }
//
//    void Print()
//    {
//        cout << _year << "-" << _month << "-" << _day << endl;
//    }
//
//    //private:  // 注释掉private才能访问
//    int _year;
//    int _month;
//    int _day;
//};
//
//// 重载为全局的⾯临对象访问私有成员变量的问题
//bool operator==(const Date& d1, const Date& d2)
//{
//    return d1._year == d2._year
//        && d1._month == d2._month
//        && d1._day == d2._day;
//}
//
//int main()
//{
//    Date d1(2024, 7, 5);
//    Date d2(2024, 7, 6);
//
//    // 运算符重载函数可以显⽰调⽤
//    operator==(d1, d2);
//
//    // 编译器会转换成 operator==(d1, d2);
//    d1 == d2;
//
//    return 0;
//}

//成员运算符重载
#include<iostream>
using namespace std;

class Date
{
public:
    Date(int year = 1, int month = 1, int day = 1)
    {
        _year = year;
        _month = month;
        _day = day;
    }

    void Print()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }

    bool operator==(const Date& d)
    {
        return _year == d._year
            && _month == d._month
            && _day == d._day;
    }

    Date& operator++()  // 前置++
    {
        cout << "前置++" << endl;
        //... 实际递增逻辑
        return *this;
    }

    Date operator++(int)  // 后置++
    {
        Date tmp = *this;
        cout << "后置++" << endl;
        //... 实际递增逻辑
        return tmp;
    }

private:
    int _year;
    int _month;
    int _day;
};

int main()
{
    Date d1(2024, 7, 5);
    Date d2(2024, 7, 6);

    // 运算符重载函数可以显⽰调⽤
    d1.operator==(d2);

    // 编译器会转换成 d1.operator==(d2);
    d1 == d2;

    // 编译器会转换成 d1.operator++();
    ++d1;
    // 编译器会转换成 d1.operator++(0);
    d1++;

    return 0;
}